#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <cstdlib>
#include <thread>
using namespace std;

// int gval=100;

// string toHex(pthread_t tid)
// {
//     char ch[64];
//     snprintf(ch,sizeof(ch),"%p",tid);

//     return ch;
// }

// void *threadRun(void* args)
// {
//     while(1)
//     {
//         cout << "new thread: 我的PID" << getpid() <<"gval的值"<< gval<<"&gval"<<&gval<<endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, nullptr);
   
//     while(1)
//     {
//         std::cout << "main thread: 我的PID" <<getpid() <<"gval的值"<< gval<<"&gval"<<&gval<<std::endl;
//         gval++;
//         sleep(1);
//     }

//     return 0;
// }

// // void* threadrun(void* args)
// // {
// //     int a=10;
// //     a/=0;//一个线程出错误，整个进程直接挂掉
// //     return (void*)1;
// // }

// // int main()
// // {
// //     pthread_t tid;
// //     pthread_create(&tid,nullptr,threadrun,nullptr);

// //     pthread_join(tid,nullptr);//阻塞等待
// //     return 0;
// // }



// // void * threadsun(void* tid)
// // {
// //     while(1)
// //     {
// //         cout<<"thead id"<<toHex(pthread_self())<<endl;
// //         sleep(1);
// //     }
// // }

// // int main()
// // {
// //     pthread_t tid;
// //     pthread_create(&tid,nullptr,threadsun,nullptr);

// //     while(1)
// //     {
// //         sleep(1);
// //         cout<<"main thead id"<<toHex(pthread_self())<<endl;
// //     }


// //     return 0;
// // }

// // void threadrun()
// // {
// //     while(true)
// //     {
// //         cout << "I am a new thead for C++" << endl;
// //         sleep(1);
// //     }
// // }

// // int main()
// // {
// //     thread t1(treadsun);

// //     t1.join();
// //     return 0;
// // }

// // class Request
// // {
// // public:
// //     Request(int start, int end, const string &threadname)
// //     : start_(start), end_(end), threadname_(threadname)
// //     {}
// // public:
// //     int start_;
// //     int end_;
// //     string threadname_;
// // };

// // class Response
// // {
// // public:
// //     Response(int result, int exitcode):result_(result),exitcode_(exitcode)
// //     {}
// // public:
// //     int result_;   // 计算结果
// //     int exitcode_; // 计算结果是否可靠
// // };

// // void *sumCount(void *args) // 线程的参数和返回值，不仅仅可以用来进行传递一般参数，也可以传递对象！！
// // {
// //     Request *rq = static_cast<Request*>(args); //  Request *rq = (Request*)args
// //     Response *rsp = new Response(0,0);
// //     for(int i = rq->start_; i <= rq->end_; i++)
// //     {
// //         cout << rq->threadname_ << " is runing, caling..., " << i << endl;
// //         rsp->result_ += i;
// //         usleep(100000);
// //     }
// //     delete rq;
// //     return rsp;
// // }

// // int main()
// // {
// //     pthread_t tid;
// //     Request *rq = new Request(1, 100, "thread 1");
// //     pthread_create(&tid, nullptr, sumCount, rq);


// //     void *ret;
// //     pthread_join(tid, &ret);
// //     Response *rsp = static_cast<Response *>(ret);
// //     cout << "rsp->result: " << rsp->result_ << ", exitcode: " << rsp->exitcode_ << endl;
// //     delete rsp;
// //     return 0;
// // }


// class Request
// {
// public:
//     Request(int start,int end,const string& name)
//     :_start(start)
//     ,_end(end)
//     ,threadname(name)
//     {}
// public:
//     int _start;
//     int _end;
//     string threadname;
// };

// class Response
// {
// public:
//     Response(int result,int exitcode)
//     :_result(result)
//     ,_exitcode(exitcode)
//     {}
// public:
//     int _result;
//     int _exitcode;
// };

// void* sumCount(void*args)
// {
//     Request* rq=static_cast<Request*>(args);
    
//     Response* rep=new Response(0,0);

//     for(int i=rq->_start;i<=rq->_end;i++)
//     {
//         rep->_result+=i;
//     }
    
//     return rep;
// }

// int main()
// {
//     pthread_t tid;
//     Request* rs=new Request(1,100,"thread 1");
//     pthread_create(&tid,nullptr,sumCount,rs);

//     void *ret;
//     pthread_join(tid,&ret);
//     Response* rsp=static_cast<Response*>(ret);
//     cout<<"thread return"<<rsp->_result<<endl;
//     return 0;
// }